//
// Created by f on 2020/4/8.
//

#ifndef LANE_DETECTION_HELPER_H
#define LANE_DETECTION_HELPER_H

#include <opencv2/opencv.hpp>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <opencv2/imgproc.hpp>

using std::string;
using std::vector;

//该函数进行图像的畸变修正
void undist(cv::InputArray img, cv::OutputArray undt);

//筛选图像中的白色像素
void whiteThresh(cv::InputArray  img, cv::Mat& white, int white_threshold=190);

//筛选图像中的黄色色像素
void yellowThresh(cv::InputArray img, cv::Mat& out, int yellow=40, int thresh=15);

//透视变换
void perspectiveTransform(cv::InputArray img, cv::OutputArray warped, bool inv = false);

//对图像进行canny边缘检测
void canny(cv::InputArray img, cv::OutputArray cannyed, int lower_threshold=50, int upper_threshold=150);

//对图像进行霍夫变换，将符合条件的线描白
//效果一般，浪费性能，这次没用上
void hough(cv::InputArray cannyed, cv::InputOutputArray houghed, float slope_threshold=0.6);

//该函数接收一张坐标平面转换后的二值化图片，在没有拟合多项式的情况下,使用滑动窗口找到车道线点，返回两侧车道线点的横纵坐标列表
void findPixels0(const cv::Mat& img, vector<cv::Point2i>& leftPts, vector<cv::Point2i>& rightPts);

//该函数接收一张坐标平面转换后的二值化图片，在已有拟合多项式的情况下,在多项式曲线附近收集像素，返回像素坐标
void findPixels1(const cv::Mat& img, vector<cv::Point2i>& left_pts, vector<cv::Point2i>& right_pts, const vector<float>& old_left_fit, const vector<float>& old_right_fit);

//用cv::solve求解方程系数。注意此处x是因变量，y是自变量。返回的方程系数从低到高排序
vector<float> fitLane(const vector<cv::Point>& pts, const int& order);

//该函数计算实际尺度下的车道线方程系数
vector<float> fit2real(const vector<float>& lane_fit);

//该函数计算一侧车道线的曲率半径
float curverad(const vector<float>& lane_fit);

//该函数计算车辆中心与车道中心的距离。为正时车辆偏右
float offset(const vector<float>& left_fit, const vector<float>& right_fit);

//该函数输入左右车道线方程参数、照片，在照片上绘制车道线
void drawLine(const cv::Mat &img, cv::Mat &lane_img, vector<float> &left_fit, vector<float> &right_fit);

//几个关于相机外参矩阵的参数
const int W = 300; //该值决定坐标平面转换后两边补充的图像宽度
const int B = 216; //该值决定梯形变换的x向比例
const int H = 140; //该值决定梯形变换的y向比例，也决定图像上边多宽会被裁掉

const int IMG_ROWS = 480;
const int IMG_COLS = 640;


#endif //LANE_DETECTION_HELPER_H
